package cn.tedu.seckill.consumer;

import cn.tedu.seckill.mapper.SecMapper;
import com.jt.common.pojo.Success;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisCluster;

import java.util.Date;

@Component
public class SeckillConsumer {
    @Autowired
    SecMapper secMapper;

    @Autowired
    JedisCluster jedisCluster;

    /**
     * 任意编辑一个方法，实现消费逻辑
     * 方法的参数就是发送到rabbitmq中的对象
     * 可以String 接收body，也可以是Message接收, 包含消息属性
     */
    @RabbitListener(queues = "seckill01")
    public void consume(String msg) {
        // 接收到消息msg="13301124/321"
        // 解析
        String[] strs = msg.split("/");
        Long userPhone = Long.parseLong(strs[0]);
        Long seckillId = Long.parseLong(strs[1]);
        // 先连接redis 从redis中获取一个 seckill 1 rpop元素，成功了，说明元素没有被rpop完，具备秒杀减库存的权利
        // 测试这个功能，需要先在redis集群中进行 "rpush seckill_? 1" 几次进行模拟
        String listKey = "seckill_" + seckillId;
        String rpop = jedisCluster.rpop(listKey);
        if (rpop == null) {
            // 如果rpop结果是null说明元素已经被拿完了，后续减库存都不做了
            System.out.println("用户" + userPhone + "秒杀" + seckillId + "由于redis库存见底，秒杀失败");
            // 解决了大量请求到达数据库判断number > 0时出现的线程安全问题导致的超卖
            return;
        }
        // 执行减库存逻辑 seckill表 number -= 1
        int result = secMapper.decrSeckillNum(seckillId);
        // 判断减库存是否成功，result=1 成功 result=0 失败
        if (result == 1) {
            // 成功, 当前用户具备购买商品的资格，将成功的信息封装数据入库记录success表
            Success suc = new Success();
            Date now = new Date();
            suc.setSuccessId(now.getTime());
            suc.setCreateTime(now);
            suc.setSeckillId(seckillId);
            suc.setUserPhone(userPhone);
            suc.setState(1);
            secMapper.insertSuccess(suc);
        } else {
            // 失败, result = 0, 减库存失败，因为卖完了
            System.out.println("用户" + userPhone + "秒杀" + seckillId + "由于库存见底，秒杀失败");
        }
    }
}
